Data Clump (DCL)

Description:

DCL detects classes that contain several independent groups of fields and methods. Such a class may be divided into several smaller classes each performing their own task. Smaller classes with well-defined sets of responsibilities are easier to understand and modify.

Incorrect:

DataContainer = class
    strict private
      apples,oranges:ArrayList;
    
    public
      procedure addApple(apple:IApple);
      function getNumApples():Integer;
      procedure addOrange(orange:IOrange);
      function getNumOranges():Integer;
end;
...
procedure DataContainer.addApple(apple:IApple);
begin
  apples.Add(apple);
end;

function DataContainer.getNumApples():Integer;
begin
  result := apples.Count;
end;

procedure DataContainer.addOrange(orange:IOrange);
begin
  oranges.Add(orange);
end;

function DataContainer.getNumOranges():Integer;
begin
  result := oranges.Count;
end;

Correct:

AppleContainer = class
    strict private
      apples:ArrayList;
    
    public
      procedure addApple(apple:IApple);
      function getNumApples():Integer;
end;

OrangeContainer = class
    strict private
      oranges:ArrayList;
    
    public
      procedure addOrange(orange:IOrange);
      function getNumOranges():Integer;
end;

Refactoring: